home *** CD-ROM | disk | FTP | other *** search
- ; Assembled with Innovatronic's CAPE assembler with the SMALLOBJ directive.
- ; (i.e. PC relative code) For other assemblers, uncomment the section
- ; directive before the data section.
- ; Link as follows:
- ; Blink SmallStart.o ToSAMP.o small.lib NODEBUG to ToSAMP
- ; where SmallStart.o is the startup code included with this program and
- ; small.lib is Bryce Nesbitt's amiga lib.
- ; For Manx,
- ; as -cd -o ToSAMP ManxStartUp.o ToSAMP.o -lcl32
- ;
- ; This example uses R.J. Mical's FileIO requester in a special library form
- ; prepared by dissidents.
-
- SMALLOBJ
- OBJFILE "rad:ToSamp.o"
- OPTIMON
- ADDSYM
-
- INCLUDE "rad:FileIO.i" ;requires RJ Mical's FileIO in library form
-
- SECTION ToSampCode,CODE
-
- XREF _DOSBase,_SysBase ;from StartUp code
-
- XREF _LVOOpenLibrary,_LVOCloseLibrary,_LVOOpenWindow,_LVOCloseWindow
- XREF _LVOAllocMem,_LVOFreeMem
- XREF _LVOGetMsg,_LVOReplyMsg,_LVOWait,_LVOWaitPort
- XREF _LVOPrintIText,_LVODrawImage
- XREF _LVOMove,_LVOText,_LVOSetAPen
- XREF _LVOOpen,_LVORead,_LVOWrite,_LVOClose,_LVODelay
- XREF _LVOLock,_LVOUnLock,_LVOExamine,_LVODeleteFile
-
- MODE_OLDFILE equ 1005
- MODE_NEWFILE equ 1006
- LIB_VERSION equ 33
-
- XDEF print_type
- print_type:
- bsr.s blank
- moveq #0,d0
- move.b d5,d0
- add.b d0,d0
- add.b d0,d0
- lea TYPES,a0
- adda.l d0,a0
- move.l (a0),a4
- moveq #0,d2
- move.b (a4)+,d2
- move.b d2,NumOfChoices
- moveq #10,d3
- moveq #10,d4
- mgg moveq #26,d0
- add.w d3,d4
- move.w d4,d1
- bsr.s print_msg ;returns end of msg (beginning of next string)
- Dbra d2,mgg
- rts
-
- blank:
- moveq #17-1,d2
- moveq #10,d3
- moveq #10,d4
- mG lea SPACES,a4
- moveq #26,d0
- add.w d3,d4
- move.w d4,d1
- bsr.s print_msg
- Dbra d2,mG
- rts
-
- XDEF print_msg ;string passed in a4, x in d0, y in d1
- print_msg:
- movea.l RastPort,a2
- movea.l a2,a1
- movea.l _GfxBase,a6
- jsr _LVOMove(a6)
- movea.l a4,a0
- len move.b (a4)+,d0
- bne.s len
- move.l a4,d0
- subq.l #1,d0
- sub.l a0,d0 ;length of string
- movea.l a2,a1 ;RastPort
- jmp _LVOText(a6)
-
- XDEF print_directions
- print_directions:
- lea Directions,a4
- lea Positions,a5
- moveq #10-1,d2
- moveq #10,d3
- moveq #10,d4
- mg move.w (a5)+,d0
- add.w d3,d4
- move.w d4,d1
- bsr.s print_msg ;returns end of msg (beginning of next string)
- Dbra d2,mg
- rts
-
- XDEF print_family
- print_family:
- bsr blank
- lea Family,a4
- moveq #17-1,d2
- moveq #10,d3
- moveq #10,d4
- MG moveq #26,d0
- add.w d3,d4
- move.w d4,d1
- bsr.s print_msg ;returns end of msg (beginning of next string)
- Dbra d2,MG
- rts
-
- Positions dc.w 38,28,38,26,30,39,29,24,30,84
-
- XDEF _main
- _main:
- ;---Open Gfx Library
- movea.l _SysBase,a6
- moveq #LIB_VERSION,d0
- lea GfxName,a1
- jsr _LVOOpenLibrary(a6)
- move.l d0,_GfxBase
- bne.s xx
- rts
- ;---Open Intuition
- xx moveq #LIB_VERSION,d0
- lea IntuitionName,a1
- jsr _LVOOpenLibrary(a6)
- move.l d0,_IntuitionBase
- beq clG
- ;---Open the main window
- lea newWindow,a0
- move.l a6,-(sp)
- movea.l d0,a6
- jsr _LVOOpenWindow(a6)
- movea.l (sp)+,a6
- move.l d0,WindowPtr
- beq clI
- move.l d0,a0
- move.l 50(a0),RastPort
- ;---Open the FileIO (requester) library
- moveq #1,d0 ;version #1
- lea RequesterName,a1
- jsr _LVOOpenLibrary(a6)
- move.l d0,_RequesterBase
- bne.s gotit
- ;---error
- lea FileReqErr,a4
- moveq #5,d0
- moveq #75,d1
- bsr print_msg
- moveq #100,d1
- movea.l _DOSBase,a6
- jsr _LVODelay(a6)
- bra clW
- ;===================Get the FileIO Structure========================
- gotit movea.l d0,a6
- jsr _LVOGetFileIO(a6)
- move.l d0,FileIO
- bne.s gotIO
- lea IOerR,a4
- moveq #5,d0
- moveq #75,d1
- bsr print_msg
- moveq #100,d1
- movea.l _DOSBase,a6
- jsr _LVODelay(a6)
- bra clF
- ;---Set up info file suppression
- gotIO movea.l d0,a0
- Bset.b #INFO_SUPPRESS,1(a0) ;INFO_SUPPRESS ON
- ;--Set up the XY co-ordinates of where the requester will open
- ; If we used DoFileIOWindow(), we wouldn't need to set co-ordinates.
- moveq #6,d0
- move.w d0,FILEIO_X(a0) ;x position
- moveq #11,d0
- move.w d0,FILEIO_Y(a0) ;y position
- ;---Setup buffer for path name
- lea _BUFFER2,a1
- move.l a1,FILEIO_BUFFER(a0)
- ;---Setup Pens and DrawMode
- moveq #1,d0
- move.b d0,FILEIO_DRAWMODE(a0)
- move.b d0,FILEIO_PENA(a0)
- ;====Create a mask of the Window's UserPort's mp_Sigbit=====
- movea.l WindowPtr,a3
- movea.l 86(a3),a0
- move.b 15(a0),d0
- moveq #0,d7
- Bset.l d0,d7
- ;----Print out Directions
- START bsr print_directions
- ;********************** MAIN LOOP ******************************
- ;=====Get the message that arrived at our UserPort====
- E4 movea.l 86(a3),a0
- movea.l _SysBase,a6
- jsr _LVOGetMsg(a6)
- move.l d0,d1
- bne.s E7
- ;===Check if we are ready to exit the program=====
- Btst.b #0,Quit
- beq delFile
- ;===Wait for a message sent to our Window (from Intuition)===
- move.l d7,d0
- jsr _LVOWait(a6)
- bra.s E4
- ;====Copy all the info we want from the IntuiMessage====
- E7 movea.l d0,a1
- lea 20(a1),a0 ;get the address of the first field to copy.
- move.l (a0)+,d6 ;Copy the Class field to d6
- move.w (a0)+,d5 ;Copy the Code field to d5
- move.w (a0)+,d4 ;Copy the qualifier field to d4
- movea.l (a0)+,a2 ;Copy the IAddress field to a2
- move.w (a0)+,d3 ;Copy MouseX position to d3
- move.w (a0)+,d2 ;Copy MouseY position to d2
- ;====Now reply to the message so Intuition can dispose of it
- E8 ;Address of the message is in a1.
- jsr _LVOReplyMsg(a6)
- ;========switch (class)=========
- Bclr.l #3,d6 ;MOUSEBUTTONS
- bne.s GADG
- Bclr.l #9,d6 ;CLOSEWINDOW
- beq.s E4
- ;=========case CLOSEWINDOW:============
- CW Bclr.b #0,Quit
- bra.s E4
- ;=========case MOUSEBUTTONS:===========
- ;---Make sure that it's an UP select if MOUSEBUTTONS
- GADG subi.b #$68,d5
- beq E4 ;ignore down
- ;---get the user's filename and load the 8SVX file
- E2 bsr load_8SVX
- subq.b #1,d0
- bne.s Cerr
- ;---Convert the file to SAMP and save
- bsr convert_8SVX
- subq.b #1,d0
- bne.s Cerr
- ;---Indicate a successful conversion
- lea Success,a4
- ;---delete the 8SVX conversion buffer if it exists
- Cerr bsr free_data
- move.l a4,-(sp)
- bsr blank
- ;---Print the returned error message
- movea.l _RequesterBase,a6
- movea.l a3,a0
- move.l (sp)+,d0
- jsr _LVOAutoMessage(a6)
- bra START
- ;******************** Exit the Program *********************
- ;If the pointer to FileIO was NULL, then
- ;ReleaseFileIO just returns, so it's safe to
- ;always release any return value of GetFileIO.
- delFile movea.l FileIO,a1
- movea.l _RequesterBase,a6
- jsr _LVOReleaseFileIO(a6)
- ;---Close the graphics lib
- clF movea.l _RequesterBase,a1
- movea.l _SysBase,a6
- jsr _LVOCloseLibrary(a6)
- ;---Close the window
- clW movea.l WindowPtr,a0
- movea.l _IntuitionBase,a6
- jsr _LVOCloseWindow(a6)
- ;---Close the Intuition Lib
- clI movea.l _SysBase,a6
- movea.l _IntuitionBase,a1
- jsr _LVOCloseLibrary(a6)
- ;---Close the graphics lib
- clG movea.l _GfxBase,a1
- jmp _LVOCloseLibrary(a6)
-
- XDEF load_8SVX
- load_8SVX:
- movem.l d2/d3/d4/d5,-(sp)
- ;---Get the user's filename via the FileIO requester
- movea.l WindowPtr,a1
- movea.l FileIO,a0
- movea.l _RequesterBase,a6
- jsr _LVODoFileIO(a6)
- move.l d0,d1
- bne.s L92 ;If 0, must have been an error
- lea LibErr,a4
- outL movem.l (sp)+,d2/d3/d4/d5
- rts
- L92 addq.l #1,d0
- bne.s L90
- ;---If -1, user must have selected CANCEL
- lea Cancel,a4
- bra.s outL
- ;---Get the File's Size
- L90 movea.l FileIO,a0
- move.l FILEIO_FILESIZE(a0),d0
- move.l d0,FileSize
- bne.s L89
- ;---If size = 0, then this file must not exist (in this directory)
- L95 lea CantFind,a4
- bra.s outL
- ;---get a conversion buffer to copy in the entire 8SVX file
- L89 movea.l _SysBase,a6
- moveq #1,d1
- jsr _LVOAllocMem(a6)
- move.l d0,_8SVXData ;the address of conversion buffer
- bne.s L93
- move.l d0,FileSize ;size of conversion buffer
- lea NoMem,a4
- bra.s outL
- ;---Open the file
- L93 moveq #0,d2
- move.w #MODE_OLDFILE,d2
- lea _BUFFER2,a0
- move.l a0,d1
- movea.l _DOSBase,a6
- jsr _LVOOpen(a6)
- move.l d0,d4
- beq.s L95
- ;---Make sure that this is an 8SVX file
- moveq #20,d3 ;read the first 20 bytes
- move.l _8SVXData,d2
- move.l d4,d1
- jsr _LVORead(a6)
- sub.l d0,d3
- bne.s CloseR
- movea.l _8SVXData,a0
- addq.l #8,a0
- move.l _8SVX,d0
- sub.l (a0),d0
- beq.s readin
- ;---Not 8SVX
- NotIFF move.l d4,d1
- jsr _LVOClose(a6)
- moveq #0,d0
- lea Not8SVX,a4
- bra outL
- ;---Read in the rest of the file (starting with VHDR's oneShotHiSamples)
- readin move.l FileSize,d3
- moveq #20,d0
- sub.l d0,d3
- move.l _8SVXData,d2
- move.l d4,d1
- jsr _LVORead(a6)
- sub.l d0,d3
- CloseR move.l d4,d1
- jsr _LVOClose(a6)
- moveq #1,d0
- move.l d3,d1
- beq outL
- lea ReadErr,a4
- moveq #0,d0
- bra outL
-
- ; This frees the conversion buffer when we are done with it, and also
- ; re-initializes the data section for converting another file.
-
- XDEF free_data
- free_data:
- lea _8SVXData,a0
- move.l (a0),d0
- beq.s no8D
- clr.l (a0)+
- movea.l d0,a1
- move.l (a0),d0 ;FileSize
- clr.l (a0)
- movea.l _SysBase,a6
- jmp _LVOFreeMem(a6)
- no8D move.l d0,4(a0)
- clr.l ATAKptr
- clr.l RLSEptr
- clr.l sizeOfBODY
- clr.l nameSize
- moveq #-1,d0
- move.w d0,midiSampNum
- lea playMap,a1
- moveq #128-1,d0
- cpm clr.l (a1)+
- dbra d0,cpm
- rts
-
- XDEF divide
- ;This routine divides 2 LONGS passed in d0 and d1.
- ;d0 = d0/d1 with d2 = the remainder.
- divide:
- moveq #0,d2
- moveq #31,d3
- _1 asl.l #1,d0
- roxl.l #1,d2
- cmp.l d1,d2
- bcs.s _2
- sub.l d1,d2
- addq.l #1,d0
- _2 Dbra d3,_1
- rts
-
- XDEF convert_8SVX
- convert_8SVX:
- movem.l d2/d3/d4/d5/a3/a4,-(sp)
- ;---Make the SAMP playMap. Assign each interpolation an octave in the map
- ; The numOfChans in the playMap will be 4.
- movea.l _8SVXData,a4
- lea playMap,a1
- moveq #0,d0
- move.b 14(a4),d0 ;the number of octaves in the 8SVX file
- beq CCC
- ;---limit to 10 octaves of the 8SVX file (numbered 1 to 10)
- moveq #10,d1
- cmp.b d1,d0
- bls.s okOT
- move.b d1,d0
- okOT move.b d0,numOfWaves
- nto moveq #12-1,d1 ;1 octave of notes
- octt move.b d0,(a1)+
- move.b d0,(a1)+
- move.b d0,(a1)+
- move.b d0,(a1)+
- Dbra d1,octt
- subq.b #1,d0
- bne.s nto
- ;---Store the sampleRate
- move.w 12(a4),d1 ;samplesPerSec
- beq.s def
- move.l d1,sampleRate
- ;---calculate samplePeriod
- move.l #1000000000,d0 ;in nanoseconds
- bsr.s divide
- move.l d0,samplePeriod
- def lea 20(a4),a0 ;the chunk after VHDR
- ;================PROCESS AN 8SVX CHUNK================
- nChk bsr DoWeWantIt
- beq BodyHandler ;the last chunk in 8SVX
- subq.b #1,d0
- beq.s DoName
- subq.b #1,d0
- beq DoATAK
- subq.b #1,d0
- beq DoRLSE
- ;---Throw away this chunk (i.e. ANNO, AUTH)
- thrw move.l 4(a0),d0 ;chunk size
- Btst.l #0,d0
- beq.s even
- addq.l #1,d0
- even addq.l #8,a0
- adda.l d0,a0 ;skip to the end of the chunk
- bra.s nChk
- ;--'NAME': Copy the "Master" name to name buffer and count # of chars
- ; including NULL (+1 to append the wave number). Calculate the final
- ; resulting chunk size. Make sure that the name is an even # of bytes.
- DoName:
- lea name,a1
- moveq #19-1,d0 ;copy 19 chars (including NULL) Max
- movea.l a0,a3
- addq.l #8,a3
- move.l a1,d1
- cnm move.b (a3)+,(a1)+
- Dbeq d0,cnm
- move.l a1,d0
- clr.b -(a1)
- sub.l d1,d0 ;length of 1 wave name counting NULL
- addq.l #1,d0 ;allow for appending the wave (octave) number
- Btst.l #0,d0
- beq.s EVEN
- addq.l #1,d0
- move.b #' ',(a1)+
- EVEN move.l a1,nameNULL
- moveq #0,d1
- move.b numOfWaves,d1
- mulu.w d1,d0
- move.l d0,nameSize
- bra.s thrw
- ;---Note the address and size (bytes) of the ATAK chunk. We'll copy it to
- ; disc verbatim...once for each wave.
- DoATAK:
- movea.l a0,a3
- addq.l #4,a3
- move.l (a3)+,d0
- move.l d0,sizeOfATAK ;This should always be even.
- move.l a3,ATAKptr ;addr of EGpoints[]
- ;---add the (size of chunk) x numOfWaves to sizeOfBODY
- sze moveq #0,d1
- move.b numOfWaves,d1
- mulu.w d1,d0 ;should actually be a LONG multiply just in case!
- add.l d0,sizeOfBODY
- bra.s thrw
- DoRLSE:
- movea.l a0,a3
- addq.l #4,a3
- move.l (a3)+,d0
- move.l d0,sizeOfRLSE
- move.l a3,RLSEptr ;addr of EGPoints[]
- bra.s sze
- ;================== BODY ==========================
- BodyHandler:
- ;===Calculate size of BODY and total size of all chunks
- addq.l #8,a0 ;get beginning of sample data
- lea SampleInfo0,a3
- move.b numOfWaves,d0
- subq.b #1,d0
- move.l (a4),d4 ;oneShotHiSamples
- move.l 4(a4),d5 ;repeatHiSamples
- move.l a0,(a3)+
- move.l d4,(a3)+
- move.l d4,d1
- add.l d5,d1 ;total size of this wave
- move.l d1,d2 ;store sum of all wave sizes in d2
- moveq #80,d3 ;80 byte waveHeader in BODY for each wave
- bra.s _1o
- ;---Store one wave's waveHeader
- agns move.l a0,(a3)+ ;start address of sample data
- lsl.l #1,d4 ;2x oneShot size
- move.l d4,(a3)+ ;size of oneShot (also loopStart offset)
- lsl.l #1,d5 ;size of loop portion
- move.l d5,d1
- add.l d4,d1
- add.l d1,d2
- _1o add.l d3,d2 ;add size of waveHeader
- move.l d1,(a3)+ ;loopEnd offset (also this wave's waveSize)
- adda.l d1,a0 ;next wave
- Dbra d0,agns
- add.l d2,sizeOfBODY
- ;---calculate the total size of ALL chunks in the SAMP file
- move.l nameSize,d0
- beq.s noNh
- addq.l #8,d0 ;add 8 bytes for NAME header
- noNh add.l sizeOfBODY,d0
- add.l d0,sizeOfChunks
- ;============== ASK THE USER TO DETERMINE THE INSTRUMENT TYPE =============
- ;---Determine the family
- bsr print_family
- movea.l _SysBase,a6
- fam move.l d7,d0
- jsr _LVOWait(a6)
- movea.l WindowPtr,a1
- movea.l 86(a1),a0
- jsr _LVOGetMsg(a6)
- move.l d0,d1
- beq.s fam
- movea.l d0,a1
- lea 20(a1),a0 ;get the address of the first field to copy.
- move.l (a0)+,d2 ;Copy the Class field
- move.w (a0)+,d5 ;Copy the Code field to d5
- ;Address of the message is in a1.
- jsr _LVOReplyMsg(a6)
- ;---wait for rawkey
- Bclr.l #10,d2 ;RAWKEY
- beq.s fam
- ;---Decode rawkey into Family nibble
- Bclr.l #7,d5
- bne.s fam ;key up
- Btst.l #5,d5
- beq.s row1
- moveq #22,d1
- sub.b d1,d5
- bcs.s unkn
- cmpi.b #14,d5
- bcc.s unkn
- bra.s gtyp
- row1 moveq #16,d1
- sub.b d1,d5
- bcs.s unkn
- cmpi.b #10,d5
- bcc.s unkn
- gtyp bsr print_type
- addq.b #1,d5
- type move.l d7,d0
- movea.l _SysBase,a6
- jsr _LVOWait(a6)
- movea.l WindowPtr,a1
- movea.l 86(a1),a0
- jsr _LVOGetMsg(a6)
- move.l d0,d1
- beq.s type
- movea.l d0,a1
- lea 20(a1),a0 ;get the address of the first field to copy.
- move.l (a0)+,d2 ;Copy the Class field
- move.w (a0)+,d3 ;Copy the Code field to d3
- ;Address of the message is in a1.
- jsr _LVOReplyMsg(a6)
- ;---wait for rawkey
- Bclr.l #10,d2 ;RAWKEY
- beq.s type
- Bclr.l #7,d3
- bne.s type ;key up
- ;---Decode rawkey into Type nibble
- Btst.l #5,d3
- beq.s roW1
- moveq #22,d1
- sub.b d1,d3
- bcs.s unkn
- bra.s gtby
- roW1 moveq #16,d1
- sub.b d1,d3
- bcs.s unkn
- cmpi.b #10,d3
- bcc.s unkn
- gtby cmp.b NumOfChoices,d3
- bhi.s unkn
- addq.b #1,d3
- lsl.b #4,d3
- or.b d3,d5
- move.b d5,Itype
- ;---Ask user if he wants to save to the same Filename with .SAMP extention
- unkn lea _BUFFER2,a0
- lea SAMPext,a1
- movem.l a2/a3,-(sp)
- bsr appendstr
- movea.l _RequesterBase,a6
- movea.l WindowPtr,a0
- lea _BUFFER2,a2
- lea Same,a1
- suba.l a3,a3
- jsr _LVOAutoPrompt3(a6)
- movem.l (sp)+,a2/a3
- move.b d0,d1
- bne.s sav
- ;---Get a new name via the FileIO lib
- ;-----DoFileIO(FileIO, window)
- movea.l WindowPtr,a1
- movea.l FileIO,a0
- jsr _LVODoFileIO(a6)
- addq.l #1,d0
- bne.s sav
- ;If -1, user must have selected CANCEL. Abort the Conversion.
- lea Cancel,a4
- outS movem.l (sp)+,d2/d3/d4/d5/a3/a4
- rts
- ;---Create this file
- sav lea _BUFFER2,a0
- movea.l _DOSBase,a6
- move.l a0,d1
- moveq #0,d2
- move.w #MODE_NEWFILE,d2
- jsr _LVOOpen(a6)
- move.l d0,d4
- bne.s fh
- ;---error
- CCC lea CantCreate,a4
- bra.s outS
- ;---Write SAMP and MHDR chunks, and the 8 byte NAME header (if it exists)
- fh move.l #518+8+8,d3
- move.l nameSize,d2
- beq.s nNH
- addq.l #8,d3
- nNH lea SAMP,a0
- move.l a0,d2
- move.l d4,d1
- jsr _LVOWrite(a6)
- sub.l d0,d3
- beq.s wwOK
- ;--WRITE error
- WE move.l d4,d1
- jsr _LVOClose(a6)
- lea _BUFFER2,a0
- move.l a0,d1
- jsr _LVODeleteFile(a6)
- lea WriteErr,a4
- moveq #0,d0
- bra.s outS
- ;---Write the NAME chunk (if nameSize is not 0)
- wwOK move.l nameSize,d0
- beq.s WrOK
- moveq #0,d5
- move.b numOfWaves,d5
- subq.b #1,d5
- ;---append the wave number each time that we write out the name
- nnnn movea.l nameNULL,a0
- move.b d5,d1
- addi.b #'0',d1
- move.b d1,(a0)+
- clr.b (a0)+
- lea name,a1
- move.l a1,d2
- suba.l a1,a0
- move.l a0,d3
- move.l d4,d1
- jsr _LVOWrite(a6)
- sub.l d0,d3
- bne.s WE
- Dbra d5,nnnn
- ;---Save the 8 byte BODY header
- WrOK lea BODY,a0
- moveq #8,d3
- move.l a0,d2
- move.l d4,d1
- jsr _LVOWrite(a6)
- sub.l d0,d3
- bne.s WE
- ;********** SAVE WAVES (80 byte waveHeader and data for each wave) *********
- lea SampleInfo0,a3
- moveq #0,d5
- move.b numOfWaves,d5
- moveq #12,d0
- mulu.w d5,d0
- addq.b #6,d0
- move.b d0,rootNote ;set the rootNote for the highest octave
- subq.b #1,d5
- ;================ SAVE 1 WAVE =====================
- savesam:
- ;---Store BODY parameters for this wave
- lea waveSize,a0
- move.l 8(a3),(a0)+ ;store loopEnd in waveSize
- addq.w #1,(a0) ;inc midiSampNum
- addq.l #8,a0
- addq.l #4,a0
- move.l 4(a3),(a0)+ ;store loopStart
- move.l 8(a3),(a0)+ ;store loopEnd
- subi.b #12,(a0) ;dec to middle of previous octave
- ;---Write the 80 byte waveHeader
- moveq #80,d3
- lea waveHeader,a0
- move.l a0,d2
- move.l d4,d1
- jsr _LVOWrite(a6)
- sub.l d0,d3
- bne WE
- ;---see if there are ATAK EgPoints to write
- move.l ATAKptr,d2
- beq.s noAT
- move.l sizeOfATAK,d3
- move.l d4,d1
- jsr _LVOWrite(a6)
- sub.l d0,d3
- bne WE
- ;---Write any RLSE EgPoints
- noAT move.l RLSEptr,d2
- beq.s noRT
- move.l sizeOfRLSE,d3
- move.l d4,d1
- jsr _LVOWrite(a6)
- sub.l d0,d3
- bne WE
- ;---write the wave's data
- noRT move.l (a3)+,d2
- move.l d4,d1
- addq.l #4,a3
- move.l (a3)+,d3
- jsr _LVOWrite(a6)
- sub.l d0,d3
- bne WE
- ;---do the next wave
- Dbra d5,savesam
- ;---close the file and return success
- move.l d4,d1
- jsr _LVOClose(a6)
- moveq #1,d0
- bra outS
-
- XDEF appendstr
- appendstr:
- move.b (a0)+,d1
- bne.s appendstr
- subq.l #1,a0
- appp move.b (a1)+,(a0)+
- bne.s appp
- rts
-
- XDEF DoWeWantIt
- DoWeWantIt:
- move.l (a0),d0
- cmp.l NAME,d0
- beq.s itsNAME
- cmp.l ATAK,d0
- beq.s itsATAK
- cmp.l RLSE,d0
- beq.s itsRLSE
- sub.l BODY,d0
- bne.s unKn
- rts
- itsNAME:
- moveq #1,d0
- rts
- itsATAK:
- moveq #2,d0
- rts
- itsRLSE:
- moveq #3,d0
- rts
- unKn:
- moveq #-1,d0
- rts
-
- ; SECTION ToSAMPData,Data ;UnComment if not using CAPE
-
- XDEF newWindow
- newWindow:
- dc.w 0,0
- dc.w 640,200
- dc.b 0,1
- ;IDCMP = MOUSEBUTTONS|CLOSEWINDOW|RAWKEY
- dc.l $608
- ;WindowFlags = WINDOWCLOSE|WINDOWDEPTH|SMART_REFRESH|ACTIVATE (no FOLLOWMOUSE
- ;allowed as that messes up the requester when using DoFileIO(). If you need
- ;FOLLOWMOUSE, then use DoFileIOWindow() to open the req in its own window.)
- dc.l $100C
- dc.l 0
- dc.l 0
- dc.l WINTITLE
- ScreenPtr dc.l 0
- dc.l 0
- dc.w 96,30
- dc.w 320,200
- dc.w 1 ;WBENCHSCREEN
-
- TextAttr: ;Topaz 8 is a ROM font so doesn't need to be opened
- dc.l FONTNAME
- dc.w 8 ;TOPAZ_EIGHTY
- dc.b 0,0
-
- XDEF _GfxBase,_IntuitionBase,_RequesterBase,WindowPtr,RastPort
- XDEF _8SVXData,FileSize,FileIO,RequesterName,nameNULL,name,nameSize,NAME
-
- _GfxBase dc.l 0
- _IntuitionBase dc.l 0
- _RequesterBase dc.l 0
- WindowPtr dc.l 0
- RastPort dc.l 0
- _8SVXData dc.l 0
- FileSize dc.l 0
- FileIO dc.l 0
-
- ATAK dc.b 'ATAK'
- RLSE dc.b 'RLSE'
- _8SVX dc.b '8SVXVHDR'
- nameNULL dc.l name
- name ds.b 20 ;buffer for the NAME chunk
-
- XDEF SAMP,sizeOfChunks,MHDR,sizeOfMHDR,playMap,numOfWaves,BODY,sizeOfBODY
- XDEF name,waveSize,midiSampNum,loopType,sampleRate,samplePeriod
- XDEF loopStartPoint,loopEndPoint,rootNote,sizeOfATAK,ATAKptr,RLSEptr
- XDEF sizeOfRLSE,SampleInfo0,sizeOfFATK
-
- ;===================== SAMP PORTION ==========================
- SAMP dc.b 'SAMP'
- sizeOfChunks dc.l 518+8+8 ;MHDR size + MHDR Header + BODY Header (add
- ;sizeOfBODY, nameSize, other chunks size)
- ;------------------------------
- MHDR dc.b 'MHDR'
- sizeOfMHDR dc.l 518
- numOfWaves dc.b 0
- sampleFormat dc.b 8
- Flags dc.b 0
- playMode dc.b 1 ;MULTI default
- numOfChans dc.b 4 ;each midi note has 4 bytes in the playMap
- mhdrPad dc.b 0
- playMap ds.l 128 ;4 bytes for each of 128 midi notes
- NAME dc.b 'NAME'
- nameSize dc.l 0
-
- ;------------------------------
- BODY dc.b 'BODY'
- sizeOfBODY dc.l 0 ;add size of ATAK, RLSE, waveSize, and 80 bytes
- ;(for each wave's header)
- ;for each wave, store these 80 bytes
- waveHeader:
- waveSize dc.l 0
- midiSampNum dc.w -1 ;inc for each wave
- loopType dc.b 0 ;forward
- Itype dc.b 0 ;unKnown
- samplePeriod dc.l 55556 ;ditto
- sampleRate dc.l 18000 ;assume some default
- loopStartPoint dc.l 0
- loopEndPoint dc.l 0
- rootNote dc.b 0 ;set to the note # in middle of each octave (i.e.
- ;note number = 6 for the lowest octave)
- velocityStart dc.b 0
- velStartTable ds.w 16
- sizeOfATAK dc.l 0
- sizeOfRLSE dc.l 0
- sizeOfFATK dc.l 0
- sizeOfFRLS dc.l 0
- sizeOfUserData dc.l 0
- typeOfData dc.w 0
-
-
- ATAKptr dc.l 0
- RLSEptr dc.l 0
-
- ; For 10 waves
- SampleInfo0 dc.l 0 ;oneShot Start
- dc.l 0 ;byte offset to loopStart
- dc.l 0 ;byte offset to loopEnd (from wave beginning)
- SampleInfo1 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo2 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo3 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo4 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo5 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo6 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo7 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo8 dc.l 0
- dc.l 0
- dc.l 0
- SampleInfo9 dc.l 0
- dc.l 0
- dc.l 0
-
- XDEF SAMPext,Same,NoMem,ReadErr,WriteErr,Not8SVX,Cancel,CantFind
- XDEF CantCreate,Quit,LibErr,Success,_BUFFER2,Directions
-
- SAMPext dc.b '.SAMP',0
- Same dc.b 'Would you like to save this SAMP file as',0
- NoMem dc.b 'No memory for copy buffer.',0
- ReadErr dc.b 'A read error occurred.',0
- WriteErr dc.b 'A write error occurred.',0
- Not8SVX dc.b 'Not an IFF 8SVX file',0
- Cancel dc.b 'Conversion canceled',0
- CantFind dc.b 'Cannot find the source file.',0
- CantCreate dc.b 'Cannot create the destination file.',0
- WINTITLE dc.b '8SVX to SAMP Conversion © 1989 dissidents',0
- Quit dc.b 1
- LibErr dc.b 'FileIO library failure',0
- Success dc.b '8SVX file successfully converted.',0
-
- ; Use the following string area for Pathname buffer
- _BUFFER2:
- GfxName dc.b 'graphics.library',0
- IntuitionName dc.b 'intuition.library',0
- RequesterName dc.b 'requester.library',0
- FileReqErr dc.b 'Cannot find the "requester.library"',0
- IOerR dc.b 'Cannot get a FileIO structure.',0
- FONTNAME dc.b 'topaz.font',0
- ds.b 130
-
- Click dc.b 'Click mouse for file selection or CLOSEWINDOW.',0
- Directions:
- dc.b 'This program will convert an IFF 8SVX sampled sound file to the SAMP',0
- dc.b 'format. It requires the FileIO library in the libs drawer of your boot',0
- dc.b 'disk. Click the mouse select button to begin filename selection, or',0
- dc.b 'click on the CLOSE gadget to exit. Select the name of the 8SVX file to',0
- dc.b 'be converted via the FileIO requester, then select OK. If the file is',0
- dc.b 'successfully loaded and converted, you will be prompted to save the',0
- dc.b 'new SAMP file in the same directory with a .SAMP extention added. You',0
- dc.b 'may otherwise choose to enter a new name via the FileIO string gadgets.',0
- dc.b 'If the SAMP file is successfully saved, a requester will indicate so.',0
- dc.b 'This program was written by Jeff Glatt of dissidents.',0
- Family:
- dc.b 'Press one of the following keys for the instrument family',0
- dc.b ' ',0
- dc.b 'Q = String',0
- dc.b 'W = Woodwind',0
- dc.b 'E = Keyboard',0
- dc.b 'R = Guitar',0
- dc.b 'T = Voice',0
- dc.b 'Y = Drum1',0
- dc.b 'U = Drum2',0
- dc.b 'I = Percussion1',0
- dc.b 'O = Brass1',0
- dc.b 'P = Brass2',0
- dc.b 'A = Cymbal',0
- dc.b 'S = Effect1',0
- dc.b 'D = Effect2',0
- dc.b 'F = Synth',0
- dc.b 'Hit RETURN for Unknown',0
- SPACES:
- dc.b ' ',0
-
- CNOP 0,2
- TYPES dc.l STRING,WOOD,KEY,GUIT,VOICE,DR1,DR2,PER1,BRASS1,BRASS2
- dc.l CYMBAL,EFF1,EFF2,SYNTH
- STRING: dc.b 15-1
- dc.b 'Q = Violin bowed',0
- dc.b 'W = Violin pluck',0
- dc.b 'E = Violin Glissando',0
- dc.b 'R = Violin tremulo',0
- dc.b 'T = Viola bow',0
- dc.b 'Y = Viola pluck',0
- dc.b 'U = Viola glis.',0
- dc.b 'I = Viola trem.',0
- dc.b 'O = Cello bow',0
- dc.b 'P = Cello pluck',0
- dc.b 'A = Cello glis.',0
- dc.b 'S = Cello trem.',0
- dc.b 'D = Bass bowed',0
- dc.b 'F = Bass pluck (jazz bass)',0
- dc.b 'G = Bass trem.',0
- BRASS1 dc.b 14-1
- dc.b 'Q = Baritone sax',0
- dc.b 'W = Bari Growl',0
- dc.b 'E = Tenor Sax',0
- dc.b 'R = Tenor Growl',0
- dc.b 'T = Alto Sax',0
- dc.b 'Y = Alto Growl',0
- dc.b 'U = Soprano sax',0
- dc.b 'I = Soprano Growl',0
- dc.b 'O = Trumpet',0
- dc.b 'P = Muted Trumpet',0
- dc.b 'A = Trumpet Drop',0
- dc.b 'S = Trombone',0
- dc.b 'D = Trombone slide',0
- dc.b 'F = Trombone Mute',0
- BRASS2: dc.b 4-1
- dc.b 'Q = French Horn',0
- dc.b 'W = Tuba',0
- dc.b 'E = Flugal Horn',0
- dc.b 'R = English Horn',0
- WOOD: dc.b 9-1
- dc.b 'Q = Clarinet',0
- dc.b 'W = Flute',0
- dc.b 'E = Pan Flute',0
- dc.b 'R = Oboe',0
- dc.b 'T = Piccolo',0
- dc.b 'Y = Recorder',0
- dc.b 'U = Basson',0
- dc.b 'I = Bass Clarinet',0
- dc.b 'O = Harmonica',0
- KEY: dc.b 10-1
- dc.b 'Q = Grand Piano',0
- dc.b 'W = Elec. Piano',0
- dc.b 'E = HonkyTonk Piano',0
- dc.b 'R = Toy Piano',0
- dc.b 'T = Harpsichord',0
- dc.b 'Y = Clavinet',0
- dc.b 'U = Pipe Organ',0
- dc.b 'I = Hammond B-3',0
- dc.b 'O = Farfisa Organ',0
- dc.b 'P = Harp',0
- DR1: dc.b 15-1
- dc.b 'Q = Kick',0
- dc.b 'W = Snare',0
- dc.b 'E = Tom',0
- dc.b 'R = Timbales',0
- dc.b 'T = Conga Hit',0
- dc.b 'Y = Conga Slap',0
- dc.b 'U = Brush Snare',0
- dc.b 'I = Elec. Snare',0
- dc.b 'O = Elec. Kick',0
- dc.b 'P = Elec. Tom',0
- dc.b 'A = RimShot',0
- dc.b 'S = Cross Stick',0
- dc.b 'D = Bongo',0
- dc.b 'F = Steel Drum',0
- dc.b 'G = Double Tom',0
- DR2: dc.b 3-1
- dc.b 'Q = Timbani',0
- dc.b 'W = Timpani Roll',0
- dc.b 'E = Log Drum',0
- PER1: dc.b 12-1
- dc.b 'Q = Block',0
- dc.b 'W = Cowbell',0
- dc.b 'E = Triangle',0
- dc.b 'R = Tambourine',0
- dc.b 'T = Whistle',0
- dc.b 'Y = Maracas',0
- dc.b 'U = Bell',0
- dc.b 'I = Vibes',0
- dc.b 'O = Marimba',0
- dc.b 'P = Xylophone',0
- dc.b 'A = Tubular Bells',0
- dc.b 'S = Glockenspeil',0
- CYMBAL: dc.b 10-1
- dc.b 'Q = Closed Hihat',0
- dc.b 'W = Open Hihat',0
- dc.b 'E = Step Hihat',0
- dc.b 'R = Ride',0
- dc.b 'T = Bell Cymbal',0
- dc.b 'Y = Crash',0
- dc.b 'U = Choke Crash ',0
- dc.b 'I = Gong',0
- dc.b 'O = Bell Tree',0
- dc.b 'P = Cymbal Roll',0
- GUIT: dc.b 15-1
- dc.b 'Q = Electric',0
- dc.b 'W = Muted Electric',0
- dc.b 'E = Distorted',0
- dc.b 'R = Acoustic',0
- dc.b 'T = 12-String',0
- dc.b 'Y = Nylon String',0
- dc.b 'U = Power Chord',0
- dc.b 'I = Harmonics',0
- dc.b 'O = Chord Strum',0
- dc.b 'P = Banjo',0
- dc.b 'A = Elec. Bass',0
- dc.b 'S = Slapped Bass',0
- dc.b 'D = Popped Bass',0
- dc.b 'F = Sitar',0
- dc.b 'G = Mandolin',0
- VOICE: dc.b 7-1
- dc.b 'Q = Male Ahh',0
- dc.b 'W = Female Ahh',0
- dc.b 'E = Male OOO',0
- dc.b 'R = Female OOO',0
- dc.b 'T = Female Breathy',0
- dc.b 'Y = Laugh',0
- dc.b 'U = Whistle',0
- EFF1: dc.b 15-1
- dc.b 'Q = Explosion',0
- dc.b 'W = Gunshot',0
- dc.b 'E = Creaking Door Open',0
- dc.b 'R = Door Slam',0
- dc.b 'T = Door Close',0
- dc.b 'Y = Spacegun',0
- dc.b 'U = Jet Engine',0
- dc.b 'I = Propeller',0
- dc.b 'O = Helocopter',0
- dc.b 'P = Broken Glass',0
- dc.b 'A = Thunder',0
- dc.b 'S = Rain',0
- dc.b 'D = Birds',0
- dc.b 'F = Jungle Noises',0
- dc.b 'G = Footstep',0
- EFF2: dc.b 15-1
- dc.b 'Q = Machine Gun',0
- dc.b 'W = Telephone',0
- dc.b 'E = Dog bark',0
- dc.b 'R = Dog Growl',0
- dc.b 'T = Boat Whistle',0
- dc.b 'Y = Ocean',0
- dc.b 'U = Wind',0
- dc.b 'I = Crowd Boos',0
- dc.b 'O = Applause',0
- dc.b 'P = Roaring Crowds',0
- dc.b 'A = Scream',0
- dc.b 'S = Sword Clash',0
- dc.b 'D = Avalance',0
- dc.b 'F = Bouncing Ball',0
- dc.b 'G = Ball against bat or club',0
- SYNTH dc.b 6-1
- dc.b 'Q = Strings',0
- dc.b 'W = Square',0
- dc.b 'E = Sawtooth',0
- dc.b 'R = Triangle',0
- dc.b 'T = Sine',0
- dc.b 'Y = Noise',0
- NumOfChoices dc.b 0
-